-- $Name: IAE$
-- $Version: 0.1$
instead_version "1.3.1";

game.enable_save = true;
game.enable_autosave = false;

require 'kbd';

dofile('ini.lua');
dofile('obj.lua');
dofile('map.lua');

function init()
	goto(outdisp);
	take(pl_stat);
end;

-- Координаты квадратной области видимости
-- BUG: Ошибка, если карта размерами меньше области видимости
function view(par)
	local xmin,xmax,ymin,ymax;
	xmin = pl._x - vs;
	xmax = pl._x + vs;
	ymin = pl._y - vs;
	ymax = pl._y + vs;
	if pl._x - vs < 1 then xmin = 1; xmax = xmin + 2 * vs; end;
	if pl._x + vs > #map[pl._map][1] then xmax = #map[pl._map][1]; xmin = xmax - 2 * vs; end;
	if pl._y - vs < 1 then ymin = 1; ymax = ymin + 2 * vs; end;
	if pl._y + vs > #map[pl._map] then ymax = #map[pl._map]; ymin = ymax - 2 * vs; end;
	if par == 'ymin' then return ymin;
	elseif par == 'ymax' then return ymax;
	elseif par == 'xmin' then return xmin;
	elseif par == 'xmax' then return xmax;
	end;
end;

-- Рисование тайла
function vtile(x,y)
	local k;
	local tile = 'images/blank.png';
	if type(map[pl._map][y][x]) == 'table' then
		for k = 1, #map[pl._map][y][x] do
			if type(map[pl._map][y][x][k]) == 'table' then
				tile = tile..';'..ref(map[pl._map][y][x][k]).img;
			else tile = tile..';'..map_par[map[pl._map][y][x][k]].img;
			end;
		end;
	else tile = map_par[map[pl._map][y][x]].img;
	end;
	if x == pl._x and y == pl._y then tile = tile..';'..pl.img; end;
	return tile;
end;

-- Рисование местности
function draw_map()
	local outp = '';
	local x,y;
	local tile;
	for y = view('ymin'), view('ymax') do
		for x = view('xmin'), view('xmax') do
			outp = outp..img(vtile(x,y));
		end;
		outp = outp..'^';
	end;
	return txtc(outp);
end;

-- Игровая область
outdisp = room {
	entered = function() hook_keys('up','down','left','right','space'); end;
	forcedsc = true;
	nam = 'Test';
	dsc = function() return draw_map(); end;
	kbd = function(s, down, key)
		if down then
			if key == 'up' then move(0,-1);
			elseif key == 'down' then move(0,1);
			elseif key == 'left' then move(-1,0);
			elseif key == 'right' then move(1,0);
			elseif key == 'space' then p'aaa';
			end;
			pn "";
		end;
	end;
	exit = function() unhook_keys('up','down','left','right','space'); end;
};

-- Перемещение игрока
function move(x,y)
	if not coll(x,y) then
		pl._x = pl._x + x;
		pl._y = pl._y + y;
	end;
end;

-- Проверка проходимости и действия над обьектами
function coll(x,y)
	local k;
	if pl._x + x < 1 or pl._x + x > #map[pl._map][1] then return true; end;
	if pl._y + y < 1 or pl._y + y > #map[pl._map] then return true; end;
	if type(map[pl._map][pl._y+y][pl._x+x]) == 'table' then
		for k = 1, #map[pl._map][pl._y+y][pl._x+x] do
			if type(map[pl._map][pl._y+y][pl._x+x][k]) == 'table' then
				ref(map[pl._map][pl._y+y][pl._x+x][k]).act();
				if ref(map[pl._map][pl._y+y][pl._x+x][k]).mov[1] == 0 then return true; end;
			elseif map_par[map[pl._map][pl._y+y][pl._x+x][k]].mov[1] == 0 then return true;
			end;
		end;
	elseif map_par[map[pl._map][pl._y+y][pl._x+x]].mov[1] == 0 then return true;
	end;
	return false;
end;

-- Debug
pl_stat = stat {
	nam = function()
		local outp;
		outp = 'pl._x = '..pl._x..'^pl._y = '..pl._y..'^vs = '..vs;
		return outp;
	end;
};
